package com.wgf.config;

import com.wgf.service.ChatAssistant;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LLMConfig
{
    @Bean
    public ChatModel chatModel()
    {
        return OpenAiChatModel.builder()
                    .apiKey(System.getenv("aliQwen-api"))
                    .modelName("qwen-plus")
                    .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }

    /**
     * 需要预处理文档并将其存储在专门的嵌入存储（也称为矢量数据库）中。当用户提出问题时，这对于快速找到相关信息是必要的。
     * 我们可以使用我们支持的 15 多个嵌入存储中的任何一个，但为了简单起见，我们将使用内存中的嵌入存储： 
      * https://docs.langchain4j.dev/integrations/embedding-stores/in-memory
     * @return
     */
    @Bean//创建内存中的嵌入存储 Bean
    public InMemoryEmbeddingStore<TextSegment> embeddingStore() {
        return new InMemoryEmbeddingStore<>();//创建新的内存嵌入存储实例
    }


    @Bean//创建聊天助手 Bean，集成了聊天模型、记忆功能和内容检索功能
    public ChatAssistant assistant(ChatModel chatModel, EmbeddingStore<TextSegment> embeddingStore)
    {
        return AiServices.builder(ChatAssistant.class)//使用 LangChain4j 的 AI 服务构建器
                    .chatModel(chatModel)//设置聊天模型,用于生成回答
                    .chatMemory(MessageWindowChatMemory.withMaxMessages(50))//设置聊天记忆，保留最近50条消息
                    .contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore))//设置内容检索器，从嵌入存储中检索相关信息
                .build();
    }
}